/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dominio;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Agustin
 */
public class Controladora {

    private static Controladora instance;
    private Usuario usuario;
    private Empresa empresa;

    public static Controladora getInstance() {
        if (instance == null) {
            instance = new Controladora();
        }
        return instance;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    public boolean isNumeric(String cadena) {
        try {
            Integer.parseInt(cadena);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }
    }

    public String limpiarE(Exception e) {
        String mensaje = "";
        int i = e.getMessage().toCharArray().length;
        boolean bool = false;
        for (int x = 0; x < i; x++) {
            if (e.getMessage().charAt(x) == ':') {
                bool = true;
            }
        }
        if (bool) {
            for (int x = 20; x < i; x++) {
                mensaje += "" + e.getMessage().charAt(x);
            }
        } else {
            mensaje = e.getMessage();
        }
        return mensaje;
    }

    public List<Especialidad> traerEspecialidadMAsCalificada() {
        Especialidad es = new Especialidad();
        List<Especialidad> especialidades = new ArrayList<Especialidad>();
        try {
            especialidades = es.traerEspecialidadMAsCalificada();
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return especialidades;
    }
     public void actualizar() {
        Usuario u = new Usuario();
        try {
            u.Actualizar();
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
     
    }



    public List<Especialidad> traerEspecialidades(String nombre) {
        List<Especialidad> especialidades = new ArrayList<Especialidad>();
        Especialidad es = new Especialidad();
        try {
            especialidades = es.traerEspecialidades(nombre);
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return especialidades;
    }

    public void crearEspecialidad(String nombre, String VHB) {
        try {
            if (!nombre.equals("")) {
                if (traerEspecialidades(nombre).get(0).getNombre() == null) {
                    if (isNumeric(VHB)) {
                        Especialidad es = new Especialidad();
                        es.crearEspecialidad(nombre, Integer.parseInt(VHB));
                    } else {
                        throw new Exception("El VHE debe ser numerico.");
                    }
                } else {
                    throw new Exception("La Especialidad ya existe.");
                }
            } else {
                throw new Exception("El campo 'Nombre Especialidad' no puede estar vacio.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
    }

    public void crearUsuario(String nombre_usuario, String contraseña, String experiencia, String nombre, String especialidad) {
        try {
            if (!nombre_usuario.equals("") && !contraseña.equals("") && !experiencia.equals("") && !nombre.equals("") && !especialidad.equals("")) {
                Usuario u = traerUsuarios(nombre_usuario).get(0);
                if (u.getNombre_usuario() == null) {
                    if (isNumeric(experiencia)) {
                        if(Integer.parseInt(experiencia)>0){
                        Especialidad e = traerEspecialidades(especialidad).get(0);
                        if (e.getNombre() != null) {
                            u.crearUsuario(nombre_usuario, contraseña, Integer.parseInt(experiencia), nombre, especialidad);
                        } else {
                            throw new Exception("La Especialidad no existe.");
                        }
                        }else{
                            throw new Exception("La experiencia extra no puede ser menor a 0");
                        }
                        
                    } else {
                        throw new Exception("La Experiencia debe ser numerica");
                    }
                } else {
                    throw new Exception("El Usuario ya existe.");
                }
            } else {
                throw new Exception("Ningun campo puede estar vacio.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }

    }

    public void modificarUsuario(String nombre_usuario, String contraseña, String experiencia, String experienciaExtra, String nombre, String especialidad) {
        Usuario u = new Usuario();
        try {
            if (!nombre_usuario.equals("") && !contraseña.equals("") && !experiencia.equals("") && !especialidad.equals("")) {
                u = traerUsuarios(nombre_usuario).get(0);
                if (u.getNombre_usuario() != null) {
                    if (u.getContraseña().equals(contraseña)) {
                        Especialidad e = traerEspecialidades(especialidad).get(0);
                        if (e.getNombre() != null) {
                            if (isNumeric(experiencia)) {
                                if (isNumeric(experienciaExtra)) {
                                    u.modificarUsuario(nombre_usuario, contraseña, Integer.parseInt(experiencia), Integer.parseInt(experienciaExtra), nombre, especialidad);
                                } else {
                                    throw new Exception("la experiecia extra debe ser numerica");
                                }

                            } else {
                                throw new Exception("La experiencia debe ser numerica.");
                            }
                        } else {
                            throw new Exception("La Especialidad no existe.");
                        }
                    } else {
                        throw new Exception("La contraseña no es correcta.");
                    }
                } else {
                    throw new Exception("El Usuario no existe.");
                }
            } else {
                throw new Exception("Ningun campo puede ser vacio.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
    }

    public void bajaUsuario(String nombre_usuario, String contraseña) {
        Usuario u = new Usuario();
        try {
            if (!nombre_usuario.equals("") && !contraseña.equals("")) {
                u = traerUsuarios(nombre_usuario).get(0);
                if (u.getNombre_usuario() != null) {
                    if (u.getContraseña().equals(contraseña)) {
                        u.bajaUsuario(nombre_usuario);
                    } else {
                        throw new Exception("La contraseña no es correcta.");
                    }
                } else {
                    throw new Exception("El Usuario no existe.");
                }
            } else {
                throw new Exception("El nombre de usuario ni la contraseña pueden ser vacios.");
            }

        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
    }

    public void crearContacto(String nombre_usuario, String nombre_usuario_contacto) {
        Usuario u = new Usuario();
        try {
            if (!nombre_usuario.equals("")) {
                if (!nombre_usuario_contacto.equals("")) {
                    if (!nombre_usuario.equals(nombre_usuario_contacto)) {
                        Usuario ux = traerUsuarios(nombre_usuario).get(0);
                        u = traerUsuarios(nombre_usuario_contacto).get(0);
                        if (ux.getNombre_usuario() != null) {
                            if (u.getNombre_usuario() != null) {
                                u.crearContacto(nombre_usuario, nombre_usuario_contacto);
                            } else {
                                throw new Exception("El Contacto no existe.");
                            }
                        } else {
                            throw new Exception("El Usuario no existe.");
                        }
                    } else {
                        throw new Exception("No puede agregarce a si mismo como contacto");
                    }
                } else {
                    throw new Exception("El nombre del contacto no puede ser vacio");
                }
            } else {
                throw new Exception("El nombre de usuario no puede ser vacio. ");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
    }

    public void dejarUsuario(String nombre_usuario, String rut) {
        Usuario u = new Usuario();
        try {
            if (!nombre_usuario.equals("")) {
                if (!rut.equals("")) {
                    if (isNumeric(rut)) {
                        u = traerUsuarios(nombre_usuario).get(0);
                        if (u.getNombre_usuario() != null) {
                            Empresa e = traerEmpresasActivas(rut).get(0);
                            if (e.getRazon_social() != null) {
                                List<Usuario> emplados = selectEmpleados(rut, 0 + "");
                                boolean b = false;
                                for (Usuario em : emplados) {
                                    if (em.getNombre_usuario() != null) {
                                        if (em.getNombre_usuario().equals(nombre_usuario)) {
                                            b = true;
                                        }
                                    }

                                }
                                if (b) {
                                    u.dejarEmpresa(nombre_usuario, Integer.parseInt(rut));
                                } else {
                                    throw new Exception("El Usuario no es Empleado de la Empresa");
                                }
                            } else {
                                throw new Exception("La empresa no existe");
                            }
                        } else {
                            throw new Exception("El Usuario no existe.");
                        }
                    } else {
                        throw new Exception("El rut debe ser numerico");
                    }
                } else {
                    throw new Exception("El Rut no puede ser vacio.");
                }
            } else {
                throw new Exception("El nombre de usuario no puede ser vacio.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
    }

    public List<Usuario> traerUsuarios(String nombre_usuario) {
        List<Usuario> usuarios = new ArrayList<Usuario>();
        try {
            Usuario u = new Usuario();
            usuarios = u.traerUsuarios(nombre_usuario);
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return usuarios;

    }

    public List<Usuario> traerContactos(String nombre_usuario) {
        List<Usuario> usuarios = new ArrayList<Usuario>();
        Usuario u = new Usuario();
        try {
            if (!nombre_usuario.equals("")) {
                u = u.traerUsuarios(nombre_usuario).get(0);
                if (u.getNombre_usuario() != null) {
                    usuarios = u.traerContactos(nombre_usuario);
                } else {
                    throw new Exception("El usuario no existe.");
                }
            } else {
                throw new Exception("El nombre de usuario no puede ser vacio.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return usuarios;

    }

    public List<Usuario> traerSujerencias(String nombre_usuario, String especialidad) {
        List<Usuario> usuarios = new ArrayList<Usuario>();
        Usuario u = new Usuario();
        try {
            if (!nombre_usuario.equals("")) {
                if (!especialidad.equals("")) {
                    u = u.traerUsuarios(nombre_usuario).get(0);
                    if (u.getNombre_usuario() != null) {
                        Especialidad e = traerEspecialidades(especialidad).get(0);
                        if (e.getNombre() != null) {

                            usuarios = u.traerSujerencias(nombre_usuario, especialidad);
                        } else {
                            throw new Exception("La Especialidad no existe.");
                        }
                    } else {
                        throw new Exception("El Usuario no existe.");
                    }
                } else {
                    throw new Exception("La Especialidad no puede ser vacia.");
                }
            } else {
                throw new Exception("El nombre de usuario no puede ser vacio.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return usuarios;

    }

    public boolean controlarRazonSocial(String razonSocial, String rut) {
        boolean b = true;
        try {
            if (!razonSocial.equals("")) {
                List<Empresa> empresas = Controladora.getInstance().traerEmpresasActivas(0 + "");
                List<Empresa> empresas1 = Controladora.getInstance().traerEmpresasInactivas(0 + "");
                for (Empresa emp : empresas) {
                    if (emp.getRazon_social().equals(razonSocial)) {
                        String r = emp.getRut() + "";
                        if (!r.equals(rut)) {
                            b = false;
                        }
                    }
                }
                for (Empresa emp : empresas1) {
                    if (emp.getRazon_social().equals(razonSocial)) {
                        String r = emp.getRut() + "";
                        if (!r.equals(rut)) {
                            b = false;
                        }
                    }
                }
            } else {
                throw new Exception("La razon social no puede ser vacia.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return b;
    }

    public int crearEmpresa(String rut, String razon_social, String nombre, String direccion, String barrio, String telefono) {
        int resultado = 0;
        Empresa em = new Empresa();
        try {
            if (!rut.equals("") && !razon_social.equals("") && !nombre.equals("") && !direccion.equals("") && !barrio.equals("") && !telefono.equals("")) {
                if (isNumeric(rut)) {
                    if (controlarRazonSocial(razon_social, rut)) {
                        resultado = em.crearEmpresa(Integer.parseInt(rut), razon_social, nombre, direccion, barrio, telefono);
                    } else {
                        throw new Exception("El Rut no Coincide con la Razon Social");
                    }
                } else {
                    throw new Exception("El rut debe ser numerico");
                }
            } else {
                throw new Exception("No puede dejar campos vacios.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return resultado;
    }

    public void modificarEmpresa(String rut, String razon_social, String nombre, String direccion, String barrio, String telefono) {
        Empresa em = new Empresa();
        try {
            if (!rut.equals("") && !razon_social.equals("") && !nombre.equals("") && !direccion.equals("") && !barrio.equals("") && !telefono.equals("")) {
                if (isNumeric(rut)) {
                    em = traerEmpresasActivas(rut).get(0);
                    if (em.getRazon_social() != null) {
                        if (em.getRazon_social().equals(razon_social)) {
                            em.modificarEmpresa(Integer.parseInt(rut), razon_social, nombre, direccion, barrio, telefono);
                        } else {
                            throw new Exception("La Razon Social no cioncide con el Rut");
                        }
                    } else {
                        throw new Exception("La empresa no existe.");
                    }
                } else {
                    throw new Exception("El rut debe ser numerico");
                }
            } else {
                throw new Exception("No puede dejar campos vacios.");
            }

        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
    }

    public void bajaEmpresa(String rut) {
        Empresa em = new Empresa();
        try {
            if (!rut.equals("")) {
                if (isNumeric(rut)) {
                    em = traerEmpresasActivas(rut).get(0);
                    if (em.getRazon_social() != null) {
                        em.bajaEmpresa(Integer.parseInt(rut));
                    } else {
                        throw new Exception("La empresa no esta activa o no existe");
                    }
                } else {
                    throw new Exception("El Rut debe ser numerico");
                }
            } else {
                throw new Exception("El Rut no puede ser vacio");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
    }

    public int agregarEmpleado(String rut, String nombre_usuario) {
        Usuario u = new Usuario();
        int resultado = 0;
        try {
            if (!nombre_usuario.equals("")) {
                if (!rut.equals("")) {
                    if (isNumeric(rut)) {
                        u = traerUsuarios(nombre_usuario).get(0);
                        if (u.getNombre_usuario() != null) {
                            Empresa e = traerEmpresasActivas(rut).get(0);
                            if (e.getRazon_social() != null) {
                                List<Usuario> emplados = selectEmpleados(rut, 0 + "");
                                boolean b = true;
                                for (Usuario em : emplados) {
                                    if (em.getNombre_usuario() != null) {
                                        if (em.getNombre_usuario().equals(nombre_usuario)) {
                                            b = false;
                                        }
                                    }
                                }
                                if (b) {
                                    resultado = e.agregarEmpleado(Integer.parseInt(rut), nombre_usuario);
                                } else {
                                    throw new Exception("El Usuario ya es Empleado de la Empresa");
                                }
                            } else {
                                throw new Exception("La empresa no existe");
                            }
                        } else {
                            throw new Exception("El Usuario no existe.");
                        }
                    } else {
                        throw new Exception("El rut debe ser numerico");
                    }
                } else {
                    throw new Exception("El Rut no puede ser vacio.");
                }
            } else {
                throw new Exception("El nombre de usuario no puede ser vacio.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return resultado;
    }

    public List<Empresa> traerEmpresasActivas(String rut) {
        List<Empresa> empresas = new ArrayList<Empresa>();
        Empresa em = new Empresa();
        try {
            if (!rut.equals("")) {
                if (isNumeric(rut)) {
                    empresas = em.traerEmpresasActivas(Integer.parseInt(rut));
                } else {
                    throw new Exception("El Rut debe ser numerico");
                }
            } else {
                throw new Exception("El Rut no puede ser vacio");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return empresas;
    }

    public List<Empresa> traerEmpresasInactivas(String rut) {
        List<Empresa> empresas = new ArrayList<Empresa>();
        Empresa em = new Empresa();
        try {
            if (!rut.equals("")) {
                if (isNumeric(rut)) {
                    empresas = em.traerEmpresasInactivas(Integer.parseInt(rut));
                } else {
                    throw new Exception("El Rut debe ser numerico");
                }
            } else {
                throw new Exception("El Rut no puede ser vacio");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return empresas;
    }

    public List<Empresa> traerEmpresasEmpleado(String nombre_usuario) {
        List<Empresa> empresas = new ArrayList<Empresa>();
        Empresa em = new Empresa();
        try {
            if (!nombre_usuario.equals("")) {
                Usuario u = new Usuario();
                u = traerUsuarios(nombre_usuario).get(0);
                if (u.getNombre_usuario() != null) {
                    empresas = em.traerEmpresasEmpleado(nombre_usuario);
                } else {
                    throw new Exception("El usuario no existe");
                }
            } else {
                throw new Exception("El nombre de usurio no puede ser vacio.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return empresas;
    }

    public List<Usuario> selectEmpleados(String rut, String t) {
        List<Usuario> usuarios = new ArrayList<Usuario>();
        Usuario u = new Usuario();
        try {
            if (!rut.equals("")) {
                if (isNumeric(rut)) {
                    Empresa em = new Empresa();
                    em = traerEmpresasActivas(rut).get(0);
                    if (em.getRazon_social() != null) {
                        usuarios = u.traerEmpleados(Integer.parseInt(rut), Integer.parseInt(t));
                    } else {
                        throw new Exception("La Empresa no existe.");
                    }
                } else {
                    throw new Exception("El Rut debe ser numerico");
                }
            } else {
                throw new Exception("El Rut no puede ser vacio.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return usuarios;
    }

    public List<Usuario> selectUsuarioMasCotizado() {
        List<Usuario> usuarios = new ArrayList<Usuario>();
        Usuario u = new Usuario();
        try {
            usuarios = u.traerUsuarioMasCotizado();
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return usuarios;
    }

    public List<Usuario> selectSujerenciasAContratar(String especialidad, String vhu) {
        List<Usuario> usuarios = new ArrayList<Usuario>();
        Usuario u = new Usuario();
        try {
            if (!especialidad.equals("")) {
                if (!vhu.equals("")) {
                    Especialidad esp = new Especialidad();
                    esp = traerEspecialidades(especialidad).get(0);
                    if (esp.getNombre() != null) {
                        int rut = Controladora.getInstance().getEmpresa().getRut();
                        Empresa emp = new Empresa();
                        emp = traerEmpresasActivas(rut + "").get(0);
                        if (emp.getRazon_social() != null) {
                            usuarios = u.traerSujerenciasAContratar(especialidad, Integer.parseInt(vhu), rut);
                        } else {
                            throw new Exception("La Empresa no Existe");
                        }
                    } else {
                        throw new Exception("La Especialidad no existe.");
                    }
                } else {
                    throw new Exception("El VHU no piede ser vacio.");
                }
            } else {
                throw new Exception("La especialidad no puede ser vacia.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return usuarios;
    }

    public int calificarEmpleados(String nombre_usuario, String valor, String comentario) {
        int resultado = 0;
        Empresa emp = new Empresa();
        try {
            if (!nombre_usuario.equals("") && !valor.equals("") && !comentario.equals("")) {
                Usuario u = new Usuario();
                u = traerUsuarios(nombre_usuario).get(0);
                if (u.getNombre_usuario() != null) {
                    if (isNumeric(valor)) {
                        int rut = Controladora.getInstance().getEmpresa().getRut();
                        emp = traerEmpresasActivas(rut + "").get(0);
                        if (emp.getRazon_social() != null) {
                            if (valor.equals("1") || valor.equals("-1")) {
                                resultado = emp.calificarEmpleados(rut, nombre_usuario, Integer.parseInt(valor), comentario);
                            } else {
                                throw new Exception("El calor de las calificaciones solo puede ser 1 o -1.");
                            }
                        } else {
                            throw new Exception("La Empresa no existe");
                        }
                    } else {
                        throw new Exception("El valos debe ser numerico");
                    }
                } else {
                    throw new Exception("El Empleado no existe");
                }
            } else {
                throw new Exception("Ningun campo puede ser vacio.");
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return resultado;
    }
}
